home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PCGUIA 117
/
PC Guia 117.iso
/
Software
/
Utils
/
Software2
/
Product11
/
Setup.exe
/
MT-3.16-full-en_US
/
extlib
/
DateTimePPExtra.pm
< prev
next >
Wrap
Text File
|
2004-04-19
|
1KB
|
72 lines
package DateTime;
use strict;
require DateTime::LeapSecond;
sub _normalize_tai_seconds
{
return if grep { $_ == INFINITY() || $_ == NEG_INFINITY() } @_[1,2];
# This must be after checking for infinity, because it breaks in
# presence of use integer !
use integer;
my $adj;
if ( $_[2] < 0 )
{
$adj = ( $_[2] - 86399 ) / 86400;
}
else
{
$adj = $_[2] / 86400;
}
$_[1] += $adj;
$_[2] -= $adj * 86400;
}
sub _normalize_leap_seconds
{
# args: 0 => days, 1 => seconds
my $delta_days;
use integer;
# rough adjust - can adjust many days
if ( $_[2] < 0 )
{
$delta_days = ($_[2] - 86399) / 86400;
}
else
{
$delta_days = $_[2] / 86400;
}
my $new_day = $_[1] + $delta_days;
my $delta_seconds = ( 86400 * $delta_days ) +
DateTime::LeapSecond::leap_seconds( $new_day ) -
DateTime::LeapSecond::leap_seconds( $_[1] );
$_[2] -= $delta_seconds;
$_[1] = $new_day;
# fine adjust - up to 1 day
my $day_length = DateTime::LeapSecond::day_length( $new_day );
if ( $_[2] >= $day_length )
{
$_[2] -= $day_length;
$_[1]++;
}
elsif ( $_[2] < 0 )
{
$day_length = DateTime::LeapSecond::day_length( $new_day - 1 );
$_[2] += $day_length;
$_[1]--;
}
}
1;